<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>RESTfull 简介</title>
  
    <meta name="author" content="jouyouyun">

    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
    <!--[if lt IE 9]>
      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->

    <!-- Le styles -->
    <link href="/assets/twitter/stylesheets/bootstrap.min.css" type="text/css" rel="stylesheet" media="all">
<link href="/assets/twitter/stylesheets/style.css" type="text/css" rel="stylesheet" media="all">
<link href="/assets/twitter/widgets/google_prettify/stylesheets/twitter-bootstrap.css" type="text/css" rel="stylesheet" media="all">
 

    <!-- Le fav and touch icons -->
  <!-- Update these with your own images
    <link rel="shortcut icon" href="images/favicon.ico">
    <link rel="apple-touch-icon" href="images/apple-touch-icon.png">
    <link rel="apple-touch-icon" sizes="72x72" href="images/apple-touch-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-114x114.png">
  -->
  </head>

  <body>

    <div class="navbar">
      <div class="navbar-inner">
        <div class="container">
          <a class="brand" href="/">Jouyouyun&#39;s Blog</a>
          <ul class="nav">
            
              


  <li><a href="/archive">Archive</a></li>


            
              


  <li><a href="/tags">Tags</a></li>


            
              


  <li><a href="/categories">Categories</a></li>


            
              


  <li><a href="/about">About Me</a></li>


            
          </ul>
        </div>
      </div>
    </div>

    <div class="container">

      <div class="content">
        <div class="page-header">
  <h1>RESTfull 简介 </h1>
</div>

<div class="row">
  <div class="span8">
    <h2>简介</h2>

<p><code>RESTfull</code> 即表现层状态转换，是一种设计风格，不是标准。其要点如下：</p>

<ul>
<li>资源由 <code>URI</code> 来指定</li>
</ul>

<blockquote>
<p>每个资源都有与之对应的 <code>URI</code>，一个 <code>URI</code> 只能对应一种资源，但一种资源可以对应多个 <code>URI</code>(不同的分类方法)。</p>
</blockquote>

<ul>
<li>对资源的操作对应到 <code>HTTP</code> 协议提供的方法</li>
</ul>

<blockquote>
<p>如增删改查等操作，对应 <code>HTTP</code> 协议的 <code>POST, DELETE, PUT, GET</code> 等方法</p>
</blockquote>

<ul>
<li>资源的表现形式通常广泛流行的协议和标准</li>
</ul>

<blockquote>
<p>如 <code>JSON, XML, HTML</code> 等格式，当然也可以是其它格式或者私有格式，但一定足够能描述自己</p>
</blockquote>

<ul>
<li>通过操作资源的表现形式来操作资源</li>
</ul>

<blockquote>
<p>通过修改表现形式再辅以 <code>HTTP</code> 协议的方法，应用就可以管理资源</p>
</blockquote>

<ul>
<li>以超媒体作为应用状态的引擎</li>
</ul>

<blockquote>
<p>资源相关操作的 <code>URI</code> 可附加在表现形式内，应用根据自身状态选择相应的 <code>URI</code> 来更改状态。</p>

<p>操作可以是 <code>URI</code> 外，也可以是一段代码，让应用执行。</p>
</blockquote>

<p>总结起来就是：通过改变资源的表现形式来更改资源状态，以表现形式里的超媒体信息来引导应用的状态改变。</p>

<p>现在很多设计只用到了 <strong>资源 <code>+</code> <code>HTTP</code>动词</strong> 的方式，但 <strong>超媒体</strong> 不容忽视，是与应用交互的核心。</p>

<h2><code>HTTP</code> 方法使用</h2>

<p>下面介绍几种常用的 <code>HTTP</code> 协议方法:</p>

<ul>
<li>POST</li>
</ul>

<blockquote>
<p>用于资源的添加</p>
</blockquote>

<ul>
<li>DELETE</li>
</ul>

<blockquote>
<p>用于资源的删除</p>
</blockquote>

<ul>
<li>PUT</li>
</ul>

<blockquote>
<p>用于修改资源，需要提供完整的资源信息，可用于修改资源多项字段</p>
</blockquote>

<ul>
<li>GET</li>
</ul>

<blockquote>
<p>用于资源的获取</p>
</blockquote>

<ul>
<li>PATCH</li>
</ul>

<blockquote>
<p>用于修改资源的单个字段</p>
</blockquote>

<h2>示例</h2>

<p>如构建一个用户信息服务，<code>API</code> 按照 <code>RESTfull</code> 风格可设计如下：</p>

<ul>
<li><p><code>[POST] /users/:user</code> 添加用户</p></li>

<li><p><code>[DELETE] /users/:user</code> 删除用户</p></li>

<li><p><code>[PUT] /users/:user</code> 修改用户整体信息</p></li>

<li><p><code>[PATCH] /users/:user</code> 修改用户的单个字段</p></li>

<li><p><code>[GET] /users/:user</code> 获取用户信息</p></li>

<li><p><code>[GET] /users</code> 获取所有用户信息</p></li>
</ul>

<p>另外在 <code>GET</code> 的信息中加入 <code>DELETE, PUT, PATCH</code> 的 <code>URI</code>，应用就可以根据这些 <code>URI</code> 显示可以进行的操作，动态的生成页面。
此种方法也减少了耦合，避免了 <code>URI</code> 变更时大量的修改。</p>

<hr />

<p>尽管上面的描述很简单，但也能发现采用 <code>RESTfull</code> 来设计 <code>Web API</code> 是一种简洁明了的方案，通过与 <code>HTTP</code> 动词结合，避免了在 <code>URI</code> 中设置大量动词的问题，需要关注的只是对资源的抽象和划分。</p>

<p>本文到此为止，关于 <code>RESTfull</code> 更多更详尽的内容请自行查找。</p>

<h2>参考文档</h2>

<ul>
<li><a href="http://www.infoq.com/cn/articles/rest-introduction">深入浅出REST</a></li>
<li><a href="http://www.ruanyifeng.com/blog/2011/09/restful.html">理解RESTful架构</a></li>
<li><a href="http://www.ruanyifeng.com/blog/2014/05/restful_api.html">RESTful API 设计指南</a></li>
<li><a href="http://novoland.github.io/%E8%AE%BE%E8%AE%A1/2015/08/17/Restful%20API%20%E7%9A%84%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83.html">Restful API 的设计规范</a></li>
</ul>

    <hr>
    <div class="pagination">
      <ul>
        <ul>
          
            <li class="prev"><a href="/Blog/%E4%BF%AE%E5%A4%8D-superblock/" title="修复 superblock">&larr; Previous</a></li>
          
          

            <li><a href="/archive">Archive</a></li>

          
            <li class="next"><a href="/Blog/Git-Rebase-%E5%9B%9E%E9%80%80/" title="Git Rebase 回退">Next &rarr;</a></li>
          
          
        </ul>
      </ul>
    </div>
    <hr>
    
<div id="disqus_thread"></div>
<script>
    var disqus_developer = 1;
    var disqus_shortname = 'jekyllbootstrap'; // required: replace example with your forum shortname
    /* * * DON'T EDIT BELOW THIS LINE * * */
    (function() {
        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
        dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
    })();
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="http://disqus.com" class="dsq-brlink">blog comments powered by <span class="logo-disqus">Disqus</span></a>

  </div>
  
  <div class="span4">
    <h4>Published</h4>
    <div class="date"><span>2018-05-10</span></div>
    <br>
    <h4>Categories</h4>
    <ul class="tag_box">
    
      <li>
  <a href="/categories/#Blog-ref">Blog <span>23</span></a>
</li>
    
    </ul>
    <br>
    <h4>Tags</h4>
    <ul class="tag_box">
    
      <li>
  <a href="/tags/#rest-ref">rest <span>1</span></a>
</li>
    
      <li>
  <a href="/tags/#restfull-ref">restfull <span>1</span></a>
</li>
    
    </ul>
  </div>
</div>

      </div>

      <footer>
        <p>&copy; jouyouyun 2013 
          with help from <a href="http://github.com/wendal/gor" target="_blank" title="Gor -- Fast Blog">Gor</a>
          and <a href="http://twitter.github.com/bootstrap/" target="_blank">Twitter Bootstrap</a>
		  and Idea from <a href="http://ruhoh.com" target="_blank" title="The Definitive Technical Blogging Framework">ruhoh</a>
        </p>
      </footer>

    </div> <!-- /container -->

    
<script src="//cdnjscn.b0.upaiyun.com/libs/prettify/r298/prettify.min.js"></script>
<script>
  var pres = document.getElementsByTagName("pre");
  for (var i=0; i < pres.length; ++i) {
    pres[i].className = "prettyprint linenums";
  }
  prettyPrint();
</script>

    
<script type="text/javascript">

  var _gaq = _gaq || [];
  var pluginUrl = '//www.google-analytics.com/plugins/ga/inpage_linkid.js';
  _gaq.push(['_require', 'inpage_linkid', pluginUrl]);
  _gaq.push(['_setAccount', 'UA-123-12']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>
  </body>
</html>
